package com.huan.netty01.client;

import com.huan.netty01.netty.MyClientHandler;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

/**
 * @author 作者:刘欢
 * @create 2024-03-19-17:46
 */
public class Client2 {

    public static void main(String[] args) throws InterruptedException {
        NioEventLoopGroup eventExecutors = new NioEventLoopGroup();
        try {
            //创建bootstrap对象，配置参数
            Bootstrap bootstrap = new Bootstrap();
            //设置线程组
            bootstrap.group(eventExecutors)
                    //设置客户端的通道实现类型  异步非阻塞的客户端 TCP Socket 连接  NioSocketChannel  因为是异步非阻塞的。所以是首选。 同步：OioSocketChannel： 同步阻塞的客户端 TCP Socket 连接。
                    .channel(NioSocketChannel.class)
                    //使用匿名内部类初始化通道
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            //添加客户端通道的处理器
                            ch.pipeline().addLast(new MyClientHandler());
                        }
                    });

            //连接服务端
            ChannelFuture channelFuture = bootstrap.connect("192.168.1.3", 8888).sync();

            //添加监听器
//            channelFuture.addListener(new ChannelFutureListener() {
//                //使用匿名内部类，ChannelFutureListener接口
//                //重写operationComplete方法
//                @Override
//                public void operationComplete(ChannelFuture future) throws Exception {
//                    //判断是否操作成功
//                    if (future.isSuccess()) {
//                        System.out.println("连接成功");
//                    } else {
//                        System.out.println("连接失败");
//                    }
//                }
//            });
            //对通道关闭进行监听
            channelFuture.channel().closeFuture().sync();
        }
        finally {
            //关闭线程组
            eventExecutors.shutdownGracefully();
        }
    }
}
